from abc import ABC, abstractmethod
from typing import List, BinaryIO

class StreamDecoder(ABC):
    @abstractmethod
    def decrypt(self, buf: bytearray, offset: int) -> None:
        pass

class Decoder(ABC):
    @abstractmethod
    def validate(self) -> None:
        pass

    @abstractmethod
    def read(self, size: int = -1) -> bytes:
        pass

class CoverImageGetter(ABC):
    @abstractmethod
    def get_cover_image(self, ctx) -> bytes:
        pass

class AudioMeta(ABC):
    @abstractmethod
    def get_artists(self) -> List[str]:
        pass

    @abstractmethod
    def get_title(self) -> str:
        pass

    @abstractmethod
    def get_album(self) -> str:
        pass

class AudioMetaGetter(ABC):
    @abstractmethod
    def get_audio_meta(self, ctx) -> AudioMeta:
        pass
